perm filename INIT.MUS[MUS,LCS]2 blob sn#316224 filedate 1977-11-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002
C00006 00003	<EXTERNAL FUNCTION
C00008 00004	FUNCTION SYNTH(ARRAY FUNC)
C00010 00005	<comment: type 'SETMAG nchns, srate'  
C00013 00006	<FOUR INSTRUMENTS FOR ELEMENTRY COMPUTER MUSIC (+SIMP)
C00016 ENDMK
C⊗;

COMMENT: ******INITIALIZATION FILE FOR MUS10.DMP******** 10/77
***THIS IS STANFORD VERSION.

	 TO CREATE MUS10.DMP RUN COMMAND FILE, 'LMUS.CMD',
	 THEN READ IN THIS FILE BEFORE SAVING ON THE SYSTEM.

	THE FOLLOWING FUNCTIONS ARE SET UP HEREIN:
		SEG(ARRAY FUNC)
		SYNTH(ARRAY FUNC)
		POWER( N, X )   [GIVES POWER OF N TO THE XTH] ;

VARIABLE MAG,C,CF,CS,D,DF,DS,E,EF,ES,F,FF,FS,G,GF,GS,A,AF,AS,B,BF,BS;
C←261.62;  CS←DF←277.18;  D←293.66;  DS←EF←311.13;  E←FF←329.63;
F←ES←349.23;  FS←GF←369.99;  G←391.99;  GS←AF←415.31;
A←440;    AS←BF←466.16;  B←493.89; CF←B/2; BS←C*2;

NOMSG←1;  < INHIBITS REPETITIVE MESSAGES
EXTERNAL FUNCTION  SIND(A),
 	SIN(A), EXP(A), ALOG(A), SQRT(A), RDNUM(X),
	DPYSET(INTEGER POG,ARRAY DPYBUF,INTEGER SIZE),
	ALINE(INTEGER X1,INTEGER Y1,INTEGER X2,INTEGER Y2),
 	DPYOUT(INTEGER POG),  DDCLR,  NOTDD(INTEGER K),
	AIVECT(INTEGER X,INTEGER Y),  SIND(X),
	TYPLOC(INTEGER X,INTEGER Y),  RVECT(INTEGER X,INTEGER Y);

FUNCTION SEE(ARRAY FUNC);
     BEGIN  
	ARRAY DPY(225);  VARIABLE IY,I,IY2;
	DPYSET(2,DPY,225);  TYPLOC(-100,-412);
COMMENT  THIS VERSION MUST BE LOADED WITH %LNEWLIB[1,TVR] (FOR 'DDCLR')
 TYPLOC MOVES ONLY WHEN USING DATADISC.;
	ALINE(-264,200,256,200);  ALINE(-266,328,-246,328);
	ALINE(-266,456,-246,456); ALINE(-266,72,-246,72);
	ALINE(-266,-56,-246,-56); ALINE(-256,-56,-256,456);
	ALINE(0,190,0,210);       ALINE(-128,190,-128,210);
	ALINE(128,190,128,210);
	IY←INT(FUNC(0)*256.0+200.0);   AIVECT(-256,IY);

COMMENT:  DISPLAY ONLY EVERY THIRD SEGMENT ;
	FOR I←1 STEP 3 UNTIL 511 DO
	  BEGIN
		IY2←INT(FUNC(I)*256.0+200.0);
		RVECT(3,IY2-IY);    IY←IY2;
	  END;    DPYOUT(2);
       END;

FUNCTION SEEIT(ARRAY FUNC);  BEGIN
	VARIABLE K;	
 	IF NOTDD(K) < 0 THEN SEE(FUNC);
	END;

<EXTERNAL FUNCTION
<	RDNUM(X), SIND(X),
<	SIN(A),  EXP(A),  ALOG(A),  SQRT(A);
FUNCTION SEG(ARRAY FUNC);
BEGIN
VARIABLE X512,K,A1,A2,ST,STPP,STPS,IS,IT,DIF,RK;
  A1←0; ST←0; STPP←0; X512←0;
	WHILE STPP ≤ 1 DO
		BEGIN
		 RDNUM(A2);  
		 IF A2 =512 THEN X512←A2;
		 IF A2 =512 THEN RDNUM(A2);  RDNUM(STPP);
COMMENT: TYPE 512 AT FIRST TO USE 512 STEPS INSTEAD OF 100 STEPS.;
		 IF STPP ≤ 1 THEN A1←A2;
		END;

    WHILE STPP < 999 DO   
      BEGIN  
	IS← INT(STPP*5.120+.0001);
	IF X512 > 0 THEN IS←INT(STPP+.0001);
	IF IS > 512 THEN 
 	    BEGIN   PRINT " *** SMOOTHED ";
		FOR K←0 STEP 1 UNTIL 511 DO
COMMENT: READ 512 NUMS FROM A FUNC FILE.;
  		  BEGIN
		     RDNUM(RK);  FUNC(K)← RK;
		  END;
                SEEIT(FUNC); PRINT "SEG ARRAY   "; 
		RETURN;
	    END;

	STPP ← IS-1; 		STPS ← STPP-ST;
	IS ← INT(STPS);		DIF←A2-A1;
	IT←INT(ST);		ST ← STPP;
	FOR K←0 STEP 1 UNTIL IS DO
		BEGIN
		RK ← K;
		FUNC(K+IT)  ← A1+DIF*RK/STPS; 
		END;
	IF STPP = 511 THEN BEGIN 
	    SEEIT(FUNC);PRINT "SEG ARRAY   "; END;
	IF STPP ≥ 511 THEN RETURN;
	A1←A2;  ST←STPP;
	RDNUM(A2); RDNUM(STPP);
       END;
END;
FUNCTION SYNTH(ARRAY FUNC);
BEGIN
VARIABLE K,XX,H,FAC,CON,AMP,X,XK,J;
FOR J ← 0 STEP 1 UNTIL 511 DO  BEGIN
	FUNC(J) ← 0; END;
COMMENT: CLEAR THE ARRAY;
 
RDNUM(XX); 	IF XX = 99 THEN XX ← -XX;
H ← XX; 	IF XX < 0 THEN RDNUM(H);
WHILE H < 999 DO
   BEGIN
	RDNUM(AMP); 
	X ←0; CON ←0;
	IF XX < 0 THEN 
	   BEGIN
		RDNUM(X);  RDNUM(CON);
COMMENT		X ← X * 1.42222222 +1 ; COMMENT 1.422 = 512/360 ;
		X ← X * 512/360 +1;
	   END;

	FOR J ← 0 STEP 1 UNTIL 511  DO
	   BEGIN
		XK ← SIND(X*360/512) * AMP + CON;
   COMMENT: .703125 = 360/512 ;	XK ← SIND(X*.703125) * AMP + CON ;
		IF CON ≥ 100 THEN FUNC(J) ← (XK-100)*FUNC(J) ;
		IF CON < 100 THEN FUNC(J) ← FUNC(J) + XK ;
		X ← X+H;	IF X > 512 THEN X ← X-512;
	   END;
	RDNUM(H);
    END;

X ← FUNC(0);   COMMENT: NEXT FOR NORMALIZATION;
FOR J ← 1 STEP 1 UNTIL 511  DO BEGIN H ← ABS(FUNC(J)); 
	IF X < H THEN X ← H;  END;

FOR J ← 0 STEP 1 UNTIL 511  DO  BEGIN  FUNC(J) ← FUNC(J) / X ;  END;
SEEIT(FUNC);  PRINT " SYNTH ARRAY  ";	 COMMENT:********SEE(FUNC);
END;



FUNCTION POWER(X,N)=EXP(N*ALOG(X));	comment nth power of x;

<comment: type 'SETMAG; nchns, srate'  ;
FUNCTION MAGERR(X);
	BEGIN  PRINT "IMPROPER INPUT.   ";  X←0;
	  print "Type number of channels and sample rate: ";
	  END;

FUNCTION ADJRATE; BEGIN
  IF SRATE < 6400 THEN BEGIN
    IF SRATE <8 THEN SRATE ← 6400;  IF SRATE <10 THEN SRATE ← 8000;
    IF SRATE <12 THEN SRATE ← 10000;  IF SRATE <16 THEN SRATE ← 12800;  
    IF SRATE <20 THEN SRATE ← 16000;  IF SRATE <25 THEN SRATE ← 20000;
    IF SRATE <32 THEN SRATE ← 25600;  IF SRATE <40 THEN SRATE ← 32000;
    IF SRATE <50 THEN SRATE ← 40000; IF SRATE <60 THEN SRATE ← 51200;
    IF SRATE <80 THEN SRATE ← 64000; IF SRATE <100 THEN SRATE ← 80000;
    IF SRATE <120 THEN SRATE ← 102400; IF SRATE <130 THEN SRATE ← 128000;
    IF SRATE <200 THEN SRATE ← 160000; IF SRATE <220 THEN SRATE ← 204800;
    IF SRATE <260 THEN SRATE ← 256000; IF SRATE <4000 THEN SRATE ← 10000;
  	 COMMENT: YOU MAY TYPE 1 OR 12 FOR 12800, ETC. 10000=10000;
		END;  END;

Function SETMAG;
    begin
	VARIABLE X; X←0;
	WHILE X = 0 DO
		BEGIN   X←1; rdnum(nchns); rdnum(srate);
		IF NCHNS > 4  THEN  MAGERR(X);
		IF NCHNS = 3  THEN  MAGERR(X);
		IF NCHNS < 1  THEN  MAGERR(X);
		ADJRATE; 

		COMMENT: ONLY 6400, 12800, ETC. ARE ACCEPTED;
COMMENT:	IF INT(SRATE/6400+.1) } SRATE/6400 THEN MAGERR(X);
		END;

	MAG←512/srate;
	PRINT "NCHNS=",NCHNS,"  SRATE=",SRATE ;
    end;

<SRATE←12800;MAG←512/SRATE;NCHNS←1;
SETMAG; 1 12800;

<FOUR INSTRUMENTS FOR ELEMENTRY COMPUTER MUSIC (+SIMP)

INSTRUMENT SIMP;
OUTA←OUTA+ZOSCIL(P4,MAG*P3,P5);
END;

INSTRUMENT TOOT;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P6);<P6 IS TONE COLOR FOR 'TOOT'
OUTA←OUTA+U2;END;

INSTRUMENT CLAR;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P7);< P7 IS TONE COLOR FOR 'CLAR'
OUTA←OUTA+U2;END;

INSTRUMENT BRIT;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P8);< P8 IS TONE COLOR FOR 'BRIT'
OUTA←OUTA+U2;END;

INSTRUMENT BUZZ;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P9);< P9 IS TONE COLOR FOR 'BUZZ'
OUTA←OUTA+U2;END;

NOMSG←0;
ARRAY F1,F2,F3,F4,F5,F6(512);
SYNTH(F1);1 1  999; < TOOT   - SINE WAVE (USED FOR SIMP ALSO)
SEG(F2);.9 6,1 11 .9 82	.7 90  0 100; < MEZZO LEGATO
SEG(F3);1 3,1 10,.4 23,.15 40,0 100; < STACCATO
SYNTH(F4);1,.5  3,.3  5,.2  7,.1  999; < CLAR
SYNTH(F5);1,.3  2,.4  3,.2  8,.2  12 .1  999; < BRIT
SEG(F6);-1,1   1,7   -1,14   -1,100; < BUZZ
NOMSG←1;

OUTFILE←"TEST.SND";  <SETS UP DEFAULT OUTPUT FILE NAME. (BITS←12;)

PLAY;TOOT 0 .12 C 1000 F2 F1 F4 F5 F6 0;
CLAR .12;BRIT .24;BUZZ .36;
PLAY;SIMP 0 .5 A 1000 F1;FINISH;